home *** CD-ROM | disk | FTP | other *** search
/ CD Exchange / CD Exchange - Volume 1.iso / games / pd / chess / src.lha / src / amiga / amidsp.c next >
C/C++ Source or Header  |  1992-09-06  |  20KB  |  1,010 lines

  1. /*
  2.  * amidsp.c - Amiga interface for GNUCHESS, based on
  3.  * nuxdsp.c - (new)  ALPHA interface for CHESS
  4.  *
  5.  * Copyright (c) 1988,1989,1990 John Stanback
  6.  * Copyright (c) 1992 Free Software Foundation
  7.  * Copyright (c) 1992 Martin W. Scott
  8.  *
  9.  * This file is part of GNU CHESS.
  10.  *
  11.  * GNU Chess is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2, or (at your option)
  14.  * any later version.
  15.  *
  16.  * GNU Chess is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with GNU Chess; see the file COPYING.  If not, write to
  23.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  24.  */
  25. #include <ctype.h>
  26. #include <signal.h>
  27. #include <sys/types.h>
  28. #include <stdarg.h>
  29.  
  30. #define BOARD_FOREGROUND    1
  31. #define TEXT_FOREGROUND        6
  32. #define INPUT_FOREGROUND    7
  33.  
  34. #if defined(__STDC__)
  35. /* <stdlib.h> */
  36.      extern void *malloc (size_t);
  37.      extern void exit (int);
  38.  
  39. /* <string.h> */
  40.      extern char *strcat (char *, const char *);
  41.      extern int strcmp (const char *, const char *);
  42.      extern char *strcpy (char *, const char *);
  43.  
  44. /* <time.h> */
  45.      extern long int time (long int *);
  46. #endif
  47.  
  48. #include "gnuchess.h"
  49. #include "amiterm.h"
  50. #include "draw.h"
  51.  
  52. extern short int sscore[];
  53. extern short int pscore[2];
  54.  
  55. #define TAB (45)
  56. /* coordinates within a square for the following are ([1,5],[1,3]) */
  57. #define SQW (5)
  58. #define SQH (3)
  59. #define VIR_C(s)  ((flag.reverse) ? 7-column(s) : column(s))
  60. #define VIR_R(s)  ((flag.reverse) ? 7-row(s) : row(s))
  61. #define VSQ_X(x)  ((flag.reverse) ? SQW + 1 - (x) : (x))
  62. #define VSQ_Y(y)  ((flag.reverse) ? SQH + 1 - (y) : (y))
  63. #define Vblack(s) (!((VIR_C(s) + VIR_R(s)) % 2))
  64. /* Squares swapped */
  65. #define Vcoord(s,x,y) \
  66.     ((SQW)*(VIR_C(s)))+(x),((SQH)*(7-VIR_R(s))+(y))
  67. /* Squares and internal locations swapped */
  68. #define VcoordI(s,x,y) \
  69.     ((SQW)*(VIR_C(s)))+(VSQ_X(x)),((SQH)*(7-VIR_R(s))+(VSQ_Y(y)))
  70. /* Squares and internal rows swapped */
  71. #define VcoordR(s,x,y) \
  72.     ((SQW)*(VIR_C(s)))+(x),((SQH)*(7-VIR_R(s))+(VSQ_Y(y)))
  73. char Analysis[128] = "";
  74. unsigned short int MV[MAXDEPTH];
  75. int MSCORE;
  76. char *DRAW;
  77. extern char mvstr[4][6];
  78. extern short Mwpawn[64], Mbpawn[64], Mknight[2][64], Mbishop[2][64];
  79. short PositionFlag = 0;
  80. void TerminateSearch (int), Die (int);
  81.  
  82. #define OReverse standout
  83. #define ONormal standend
  84.  
  85. cursoron()
  86. {
  87.     leaveok(NULL, 0);        /* cursor on... */
  88.     attron(INPUT_FOREGROUND);    
  89.     printw("");
  90.     refresh();
  91. }
  92.  
  93. cursoroff()
  94. {
  95.     attron(TEXT_FOREGROUND);    
  96.     leaveok(NULL, 1);        /* ...cursor off */
  97. }
  98.  
  99. /* max. of 3 parameters... */
  100. ami_scanw(char *fmt, void *a1, void *a2, void *a3)/* aesthetic curses... */
  101. {
  102.     int rv;
  103.     cursoron();
  104. #ifdef I_WISH
  105.     rv = vscanw(fmt, (long *)ap);
  106. #else
  107.     rv = scanw(fmt, a1, a2, a3);
  108. #endif
  109.     cursoroff();
  110.     return rv;
  111. }
  112.  
  113. void
  114. Initialize (void)
  115. {
  116.   signal (SIGINT, Die);
  117. #ifndef AMIGA
  118.   signal (SIGQUIT, Die);
  119. #endif
  120.   initscr ();
  121.   attron(TEXT_FOREGROUND);
  122.   leaveok(NULL, 1);        /* ...cursor off */
  123.   gotoXY(22,12);
  124.   printw("Welcome to GNU CHESS. Initialising...");
  125.   refresh();
  126.   crmode ();
  127. }
  128.  
  129. void
  130. ExitChess (void)
  131. {
  132. #ifdef ALWAYSLIST
  133.   ListGame ();
  134. #endif
  135.   refresh();
  136.   nocrmode ();
  137.   endwin ();
  138.   exit (0);
  139. }
  140.  
  141. void
  142. Die (int Sig)
  143. {
  144.   char s[80];
  145.  
  146.   signal (SIGINT, SIG_IGN);
  147. #ifndef AMIGA
  148.   signal (SIGQUIT, SIG_IGN);
  149. #endif
  150.   ShowMessage (CP[31]);        /*Abort?*/
  151.   scanz ("%s", s);
  152.   if (stricmp (s, CP[210]) == 0)    /*yes*/
  153.     ExitChess ();
  154.   signal (SIGINT, Die);
  155. #ifndef AMIGA
  156.   signal (SIGQUIT, Die);
  157. #endif
  158. }
  159.  
  160. void
  161. TerminateSearch (int Sig)
  162. {
  163.   signal (SIGINT, SIG_IGN);
  164. #ifndef AMIGA
  165.   signal (SIGQUIT, SIG_IGN);
  166. #endif
  167.   if (!flag.timeout)
  168.     flag.musttimeout = true;
  169.   flag.bothsides = false;
  170.   signal (SIGINT, Die);
  171. #ifndef AMIGA
  172.   signal (SIGQUIT, Die);
  173. #endif
  174. }
  175.  
  176. void
  177. ShowLine (unsigned short int *bstline)
  178. {
  179. }
  180.  
  181. void
  182. help (void)
  183. {
  184.   ClrScreen ();
  185.   /*printz ("CHESS command summary\n");*/
  186. #ifdef NON_GFX
  187.   printz (CP[40]);
  188.   printz ("----------------------------------------------------------------\n");
  189. #else
  190.   attron(HILITE_PEN);
  191.   printz (CP[40]);
  192.   attron(TEXT_PEN);
  193. #endif
  194.   /*printz ("g1f3      move from g1 to f3      quit      Exit Chess\n");*/
  195.   printz (CP[158]);
  196.   /*printz ("Nf3       move knight to f3       beep      turn %s\n", (flag.beep) ? "off" : "on");*/
  197.   printz (CP[86], (flag.beep) ? CP[92] : CP[93]);
  198.   /*printz ("a7a8q     promote pawn to queen\n");*/
  199.   printz (CP[128], (flag.material) ? CP[92] : CP[93]);
  200.   /*printz ("o-o       castle king side        easy      turn %s\n", (flag.easy) ? "off" : "on");*/
  201.   printz (CP[173], (flag.easy) ? CP[92] : CP[93]);
  202.   /*printz ("o-o-o     castle queen side       hash      turn %s\n", (flag.hash) ? "off" : "on");*/
  203.   printz (CP[174], (flag.hash) ? CP[92] : CP[93]);
  204.   /*printz ("bd        redraw board            reverse   board display\n");*/
  205.   printz (CP[130]);
  206.   /*printz ("list      game to chess.lst       book      turn %s used %d of %d\n", (Book) ? "off" : "on", bookcount, BOOKSIZE);*/
  207.   printz (CP[170], (Book) ? CP[92] : CP[93], bookcount, BOOKSIZE);
  208.   /*printz ("undo      undo last ply           remove    take back a move\n");*/
  209.   printz (CP[200]);
  210.   /*printz ("edit      edit board              force     enter game moves\n");*/
  211.   printz (CP[153]);
  212.   /*printz ("switch    sides with computer     both      computer match\n");*/
  213.   printz (CP[194]);
  214.   /*printz ("white     computer plays white    black     computer plays black\n");*/
  215.   printz (CP[202]);
  216.   /*printz ("depth     set search depth        clock     set time control\n");*/
  217.   printz (CP[149]);
  218.   /*printz ("hint      suggest a move         post      turn %s principle variation\n", (flag.post) ? "off" : "on");*/
  219.   printz (CP[177], (flag.post) ? CP[92] : CP[93]);
  220.   /*printz ("save      game to file            get       game from file\n");*/
  221.   printz (CP[188]);
  222.   /*printz ("random    randomize play          new       start new game\n");*/
  223.   printz (CP[181]);
  224.   /*printz ("coords    show coords            rv        reverse video\n");*/
  225.   printz (CP[144]);
  226. #ifdef NON_GFX
  227.   printz (CP[192]);
  228. #define INCREMENT 0
  229. #else
  230. #define INCREMENT -1
  231. #endif
  232.   gotoXY (10, 20+INCREMENT);
  233.   printz (CP[47], ColorStr[computer]);
  234.   gotoXY (10, 21+INCREMENT);
  235.   printz (CP[97], ColorStr[opponent]);
  236.   gotoXY (10, 22+INCREMENT);
  237.   printz (CP[79], MaxResponseTime/100);
  238. #ifdef NON_GFX
  239.   gotoXY (10, 23+INCREMENT);
  240.   printz (CP[59], (flag.easy) ? CP[93] : CP[92]);
  241. #endif
  242.   gotoXY (40, 20+INCREMENT);
  243.   printz (CP[52], MaxSearchDepth);
  244.   gotoXY (40, 21+INCREMENT);
  245.   printz (CP[100], (dither) ? CP[93] : CP[92]);
  246.   gotoXY (40, 22+INCREMENT);
  247.   printz (CP[112], (flag.hash) ? CP[93] : CP[92]);
  248. #ifdef NON_GFX
  249.   gotoXY (40, 23+INCREMENT);
  250.   printz (CP[73]);
  251.   gotoXY (10, 24+INCREMENT);
  252.   printz (CP[110], (TCflag) ? CP[93] : CP[92],
  253.       TimeControl.moves[white], TimeControl.clock[white] / 100, OperatorTime, MaxSearchDepth);
  254. #else
  255.   gotoXY (10, 23+INCREMENT);
  256.   printz (CP[110], (TCflag) ? CP[93] : CP[92],
  257.       TimeControl.moves[white], TimeControl.clock[white] / 100, OperatorTime, MaxSearchDepth);
  258. #endif
  259.   refresh ();
  260.   getch ();
  261.   ClrScreen ();
  262.   UpdateDisplay (0, 0, 1, 0);
  263. }
  264.  
  265. void
  266. EditBoard (void)
  267.  
  268. /*
  269.  * Set up a board position. Pieces are entered by typing the piece followed
  270.  * by the location. For example, Nf3 will place a knight on square f3.
  271.  */
  272.  
  273. {
  274.   short a, r, c, sq, i;
  275.   char s[80];
  276.  
  277.   flag.regularstart = false;
  278.   Book = false;
  279.   ClrScreen ();
  280.   UpdateDisplay (0, 0, 1, 0);
  281.   gotoXY (TAB, 3);
  282.   printz (CP[29]);
  283.   gotoXY (TAB, 4);
  284.   printz (CP[28]);
  285.   gotoXY (TAB, 5);
  286.   printz (CP[136]);
  287.   gotoXY (TAB, 7);
  288.   printz (CP[64]);
  289.   a = white;
  290.   do
  291.     {
  292.       gotoXY (TAB, 6);
  293.       printz (CP[60], ColorStr[a]);    /*Editing %s*/
  294.       gotoXY (TAB + 24, 7);
  295.       ClrEoln ();
  296.       scanz ("%s", s);
  297.       if (s[0] == CP[28][0])    /*#*/
  298.     {
  299.           attron(BOARD_FOREGROUND);
  300.       for (sq = 0; sq < 64; sq++)
  301.         {
  302.           board[sq] = no_piece;
  303.           color[sq] = neutral;
  304.           DrawPiece (sq);
  305.         }
  306.